Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / networkVisualiserWebGL.js

Displaying Raw • Download


meshchatx/src/frontend/js/networkVisualiserWebGL.js 9566e49d1e6f82ca68eb115f5d7d660ab67719a8 (9566e49d) Text, 9.26 KB

T8b949e/**
* WebGL2 canvas renderer for MeshChatX network visualiser.
* Draws instanced node discs and line edges from WASM float buffers.
*/

Tff7b72const Te6edf3NODE_STRIDE Tff7b72= T79c0ff8Tb4b4b4;
Tff7b72const Te6edf3EDGE_STRIDE Tff7b72= T79c0ff8Tb4b4b4;

Tff7b72const Te6edf3NODE_VS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
layout(location=0) in vec2 a_corner;
layout(location=1) in vec2 a_center;
layout(location=2) in float a_size;
layout(location=3) in vec4 a_color;
uniform vec2 u_resolution;
uniform vec2 u_camera;
uniform float u_zoom;
out vec4 v_color;
out vec2 v_uv;
void main() {
v_uv = a_corner;
v_color = a_color;
float r = max(a_size, 2.0);
vec2 world = a_center + a_corner * r;
vec2 screen = (world - u_camera) * u_zoom + u_resolution * 0.5;
vec2 clip = (screen / u_resolution) * 2.0 - 1.0;
clip.y = -clip.y;
gl_Position = vec4(clip, 0.0, 1.0);
}
Ta5d6ff`Tb4b4b4;

Tff7b72const Te6edf3NODE_FS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
precision mediump float;
in vec4 v_color;
in vec2 v_uv;
out vec4 outColor;
void main() {
float d = length(v_uv);
if (d > 1.0) discard;
float edge = smoothstep(1.0, 0.72, d);
outColor = vec4(v_color.rgb, v_color.a * edge);
}
Ta5d6ff`Tb4b4b4;

Tff7b72const Te6edf3EDGE_VS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
layout(location=0) in vec2 a_pos;
layout(location=1) in vec4 a_color;
uniform vec2 u_resolution;
uniform vec2 u_camera;
uniform float u_zoom;
out vec4 v_color;
void main() {
v_color = a_color;
vec2 screen = (a_pos - u_camera) * u_zoom + u_resolution * 0.5;
vec2 clip = (screen / u_resolution) * 2.0 - 1.0;
clip.y = -clip.y;
gl_Position = vec4(clip, 0.0, 1.0);
}
Ta5d6ff`Tb4b4b4;

Tff7b72const Te6edf3EDGE_FS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
precision mediump float;
in vec4 v_color;
out vec4 outColor;
void main() {
outColor = v_color;
}
Ta5d6ff`Tb4b4b4;

Tff7b72function Te6edf3compileTb4b4b4(Te6edf3glTb4b4b4, Te6edf3typeTb4b4b4, Te6edf3srcTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3sh Tff7b72= Te6edf3glTb4b4b4.Te6edf3createShaderTb4b4b4(Te6edf3typeTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3shaderSourceTb4b4b4(Te6edf3shTb4b4b4, Te6edf3srcTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3compileShaderTb4b4b4(Te6edf3shTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3glTb4b4b4.Te6edf3getShaderParameterTb4b4b4(Te6edf3shTb4b4b4, Te6edf3glTb4b4b4.Te6edf3COMPILE_STATUSTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3info Tff7b72= Te6edf3glTb4b4b4.Te6edf3getShaderInfoLogTb4b4b4(Te6edf3shTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteShaderTb4b4b4(Te6edf3shTb4b4b4)Tb4b4b4;
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6ffWebGL shader: Tffd700${Te6edf3infoTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3shTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3linkTb4b4b4(Te6edf3glTb4b4b4, Te6edf3vsSrcTb4b4b4, Te6edf3fsSrcTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3vs Tff7b72= Te6edf3compileTb4b4b4(Te6edf3glTb4b4b4, Te6edf3glTb4b4b4.Te6edf3VERTEX_SHADERTb4b4b4, Te6edf3vsSrcTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3fs Tff7b72= Te6edf3compileTb4b4b4(Te6edf3glTb4b4b4, Te6edf3glTb4b4b4.Te6edf3FRAGMENT_SHADERTb4b4b4, Te6edf3fsSrcTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3prog Tff7b72= Te6edf3glTb4b4b4.Te6edf3createProgramTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3attachShaderTb4b4b4(Te6edf3progTb4b4b4, Te6edf3vsTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3attachShaderTb4b4b4(Te6edf3progTb4b4b4, Te6edf3fsTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3linkProgramTb4b4b4(Te6edf3progTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteShaderTb4b4b4(Te6edf3vsTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteShaderTb4b4b4(Te6edf3fsTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3glTb4b4b4.Te6edf3getProgramParameterTb4b4b4(Te6edf3progTb4b4b4, Te6edf3glTb4b4b4.Te6edf3LINK_STATUSTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3info Tff7b72= Te6edf3glTb4b4b4.Te6edf3getProgramInfoLogTb4b4b4(Te6edf3progTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteProgramTb4b4b4(Te6edf3progTb4b4b4)Tb4b4b4;
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6ffWebGL program: Tffd700${Te6edf3infoTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3progTb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {HTMLCanvasElement} canvas
* @returns {WebGL2RenderingContext|null}
*/
Tff7b72export Tff7b72function Te6edf3tryCreateWebGL2ContextTb4b4b4(Te6edf3canvasTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3canvas Tff7b72|| Tff7b72typeof Te6edf3canvasTb4b4b4.Te6edf3getContext Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72return Te6edf3canvasTb4b4b4.Te6edf3getContextTb4b4b4(Ta5d6ff"webgl2"Tb4b4b4, Tb4b4b4{
Te6edf3alphaTff7b72: Tff7b72falseTb4b4b4,
Te6edf3antialiasTff7b72: Tff7b72trueTb4b4b4,
Te6edf3depthTff7b72: Tff7b72falseTb4b4b4,
Te6edf3stencilTff7b72: Tff7b72falseTb4b4b4,
Te6edf3powerPreferenceTff7b72: Ta5d6ff"high-performance"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @param {HTMLCanvasElement} canvas
* @param {WebGL2RenderingContext} gl
*/
Tff7b72export Tff7b72function Te6edf3createNetworkVisualiserWebGLTb4b4b4(Te6edf3canvasTb4b4b4, Te6edf3glTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3nodeProg Tff7b72= Te6edf3linkTb4b4b4(Te6edf3glTb4b4b4, Te6edf3NODE_VSTb4b4b4, Te6edf3NODE_FSTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3edgeProg Tff7b72= Te6edf3linkTb4b4b4(Te6edf3glTb4b4b4, Te6edf3EDGE_VSTb4b4b4, Te6edf3EDGE_FSTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3nodeCornerBuf Tff7b72= Te6edf3glTb4b4b4.Te6edf3createBufferTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeCornerBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bufferDataTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Tff7b72new Tffa657Float32ArrayTb4b4b4(Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3STATIC_DRAWTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3nodeInstanceBuf Tff7b72= Te6edf3glTb4b4b4.Te6edf3createBufferTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3edgeBuf Tff7b72= Te6edf3glTb4b4b4.Te6edf3createBufferTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3nodeVao Tff7b72= Te6edf3glTb4b4b4.Te6edf3createVertexArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3nodeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeCornerBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff2Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;

Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeInstanceBufTb4b4b4)Tb4b4b4;
T8b949e// center xy
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3NODE_STRIDE Tff7b72* T79c0ff4Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
T8b949e// size
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff2Tb4b4b4, T79c0ff1Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3NODE_STRIDE Tff7b72* T79c0ff4Tb4b4b4, T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff2Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
T8b949e// rgba
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff3Tb4b4b4, T79c0ff4Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3NODE_STRIDE Tff7b72* T79c0ff4Tb4b4b4, T79c0ff12Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff3Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3edgeVao Tff7b72= Te6edf3glTb4b4b4.Te6edf3createVertexArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3edgeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3edgeBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff2Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, T79c0ff6 Tff7b72* T79c0ff4Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff4Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, T79c0ff6 Tff7b72* T79c0ff4Tb4b4b4, T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3uNodeRes Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_resolution"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uNodeCam Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_camera"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uNodeZoom Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_zoom"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uEdgeRes Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3edgeProgTb4b4b4, Ta5d6ff"u_resolution"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uEdgeCam Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3edgeProgTb4b4b4, Ta5d6ff"u_camera"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uEdgeZoom Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3edgeProgTb4b4b4, Ta5d6ff"u_zoom"Tb4b4b4)Tb4b4b4;

Tff7b72let Te6edf3cssW Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72let Te6edf3cssH Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72let Te6edf3nodeCount Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72let Te6edf3edgeVertexCount Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72let Te6edf3edgeScratch Tff7b72= Tff7b72new Tffa657Float32ArrayTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;

Tff7b72function Te6edf3resizeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3dpr Tff7b72= Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Tffa657windowTb4b4b4.Te6edf3devicePixelRatio Tff7b72|| T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3rect Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3getBoundingClientRectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3cssW Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3rectTb4b4b4.Te6edf3width Tff7b72|| Te6edf3canvasTb4b4b4.Te6edf3clientWidth Tff7b72|| T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3cssH Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3rectTb4b4b4.Te6edf3height Tff7b72|| Te6edf3canvasTb4b4b4.Te6edf3clientHeight Tff7b72|| T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3bw Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3cssW Tff7b72* Te6edf3dprTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3bh Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3cssH Tff7b72* Te6edf3dprTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72!== Te6edf3bw Tff7b72|| Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72!== Te6edf3bhTb4b4b4) Tb4b4b4{
Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72= Te6edf3bwTb4b4b4;
Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72= Te6edf3bhTb4b4b4;
Tb4b4b4}
Te6edf3glTb4b4b4.Te6edf3viewportTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3canvasTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3canvasTb4b4b4.Te6edf3heightTb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{ Te6edf3widthTff7b72: Te6edf3cssWTb4b4b4, Te6edf3heightTff7b72: Te6edf3cssH Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {Float32Array} nodes packed NODE_STRIDE
* @param {Float32Array} edges packed EDGE_STRIDE
* @param {{x:number,y:number,zoom:number}} camera
* @param {boolean} dark
*/
Tff7b72function Te6edf3drawTb4b4b4(Te6edf3nodesTb4b4b4, Te6edf3edgesTb4b4b4, Te6edf3cameraTb4b4b4, Te6edf3darkTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3size Tff7b72= Te6edf3resizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3camX Tff7b72= Te6edf3cameraTff7b72?Tb4b4b4.Te6edf3x Tff7b72?? T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3camY Tff7b72= Te6edf3cameraTff7b72?Tb4b4b4.Te6edf3y Tff7b72?? T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3zoom Tff7b72= Te6edf3cameraTff7b72?Tb4b4b4.Te6edf3zoom Tff7b72> T79c0ff0 Tff7b72? Te6edf3cameraTb4b4b4.Te6edf3zoom Tff7b72: T79c0ff1Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3darkTb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3clearColorTb4b4b4(T79c0ff0.035Tb4b4b4, T79c0ff0.035Tb4b4b4, T79c0ff0.04Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3clearColorTb4b4b4(T79c0ff0.973Tb4b4b4, T79c0ff0.98Tb4b4b4, T79c0ff0.988Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3glTb4b4b4.Te6edf3clearTb4b4b4(Te6edf3glTb4b4b4.Te6edf3COLOR_BUFFER_BITTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableTb4b4b4(Te6edf3glTb4b4b4.Te6edf3BLENDTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3blendFuncTb4b4b4(Te6edf3glTb4b4b4.Te6edf3SRC_ALPHATb4b4b4, Te6edf3glTb4b4b4.Te6edf3ONE_MINUS_SRC_ALPHATb4b4b4)Tb4b4b4;

Te6edf3nodeCount Tff7b72= Te6edf3nodes Tff7b72&& Te6edf3nodesTb4b4b4.Te6edf3length Tff7b72? Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3nodesTb4b4b4.Te6edf3length Tff7b72/ Te6edf3NODE_STRIDETb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3edgeCount Tff7b72= Te6edf3edges Tff7b72&& Te6edf3edgesTb4b4b4.Te6edf3length Tff7b72? Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3edgesTb4b4b4.Te6edf3length Tff7b72/ Te6edf3EDGE_STRIDETb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;

T8b949e// Expand edges to 2 verts * (xy + rgba) = 12 floats per edge -> 6 floats per vertex
Tff7b72const Te6edf3need Tff7b72= Te6edf3edgeCount Tff7b72* T79c0ff12Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3edgeScratchTb4b4b4.Te6edf3length Tff7b72< Te6edf3needTb4b4b4) Tb4b4b4{
Te6edf3edgeScratch Tff7b72= Tff7b72new Tffa657Float32ArrayTb4b4b4(Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(Te6edf3needTb4b4b4, T79c0ff64Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3edgeCountTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3o Tff7b72= Te6edf3i Tff7b72* Te6edf3EDGE_STRIDETb4b4b4;
Tff7b72const Te6edf3d Tff7b72= Te6edf3i Tff7b72* T79c0ff12Tb4b4b4;
Tff7b72const Te6edf3x1 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3oTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3y1 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3x2 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff2Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3y2 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3r Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff4Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3g Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff5Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3b Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff6Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3a Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff7Tb4b4b4]Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3dTb4b4b4] Tff7b72= Te6edf3x1Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff1Tb4b4b4] Tff7b72= Te6edf3y1Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff2Tb4b4b4] Tff7b72= Te6edf3rTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff3Tb4b4b4] Tff7b72= Te6edf3gTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff4Tb4b4b4] Tff7b72= Te6edf3bTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff5Tb4b4b4] Tff7b72= Te6edf3aTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff6Tb4b4b4] Tff7b72= Te6edf3x2Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff7Tb4b4b4] Tff7b72= Te6edf3y2Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff8Tb4b4b4] Tff7b72= Te6edf3rTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff9Tb4b4b4] Tff7b72= Te6edf3gTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff10Tb4b4b4] Tff7b72= Te6edf3bTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff11Tb4b4b4] Tff7b72= Te6edf3aTb4b4b4;
Tb4b4b4}
Te6edf3edgeVertexCount Tff7b72= Te6edf3edgeCount Tff7b72* T79c0ff2Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3edgeVertexCount Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3useProgramTb4b4b4(Te6edf3edgeProgTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uEdgeResTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3heightTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uEdgeCamTb4b4b4, Te6edf3camXTb4b4b4, Te6edf3camYTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform1fTb4b4b4(Te6edf3uEdgeZoomTb4b4b4, Te6edf3zoomTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3edgeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3edgeBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bufferDataTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3edgeScratchTb4b4b4.Te6edf3subarrayTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3needTb4b4b4)Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3DYNAMIC_DRAWTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3lineWidthTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3drawArraysTb4b4b4(Te6edf3glTb4b4b4.Te6edf3LINESTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3edgeVertexCountTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3nodeCount Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3useProgramTb4b4b4(Te6edf3nodeProgTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uNodeResTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3heightTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uNodeCamTb4b4b4, Te6edf3camXTb4b4b4, Te6edf3camYTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform1fTb4b4b4(Te6edf3uNodeZoomTb4b4b4, Te6edf3zoomTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3nodeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeInstanceBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bufferDataTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodesTb4b4b4, Te6edf3glTb4b4b4.Te6edf3DYNAMIC_DRAWTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3drawArraysInstancedTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TRIANGLESTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff6Tb4b4b4, Te6edf3nodeCountTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3sizeTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3destroyTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3deleteBufferTb4b4b4(Te6edf3nodeCornerBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteBufferTb4b4b4(Te6edf3nodeInstanceBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteBufferTb4b4b4(Te6edf3edgeBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteVertexArrayTb4b4b4(Te6edf3nodeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteVertexArrayTb4b4b4(Te6edf3edgeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteProgramTb4b4b4(Te6edf3nodeProgTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteProgramTb4b4b4(Te6edf3edgeProgTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Tb4b4b4{ Te6edf3drawTb4b4b4, Te6edf3resizeTb4b4b4, Te6edf3destroyTb4b4b4, Te6edf3getCssSizeTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{ Te6edf3widthTff7b72: Te6edf3cssWTb4b4b4, Te6edf3heightTff7b72: Te6edf3cssH Tb4b4b4}Tb4b4b4) Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72export Tb4b4b4{ Te6edf3NODE_STRIDETb4b4b4, Te6edf3EDGE_STRIDE Tb4b4b4}Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────